<?php
namespace app\admin\controller;

use app\common\controller\AdminController;
use app\common\controller\ContentController;
use app\common\logic\ContentLogic;
use think\Controller;
use think\Exception;
use think\Request;

/**
 * 模型统一处理类，有特殊需求，可以新建类，集成 ContentController 重写
 * 实现原理，利用空控制器，找不到控制器会自动跳转到空控制器处理，空控制器里面查询 models 表，如果有对应的模型则进行初始化
 */
class MyError extends Controller
{
    /**
     * 默认带的action
     * @var array
     */
    private $defaultAction = [
        'index',
        'add',
        'edit',
        'del',
    ];

    public function _empty(Request $request)
    {
        $controllerName = $request->controller();
        $actionName = $request->action();

        // 内容 方面 没有
        $conLogic = new ContentLogic();
        $mModel = $conLogic->_getModelsByCode($controllerName);
        if (!empty($mModel)) {
            $conCon = new ContentController($mModel['name'],$mModel['id']);
            // 判断方法是否存在
            if (!method_exists($conCon, $actionName)) {
                $this->error('控制器 '.$controllerName.' 找不到 '.$actionName.' 方法', null, '', 9);
            }
            else{
                return call_user_func(array($conCon,$actionName));
            }
        }

        if (!in_array($actionName, $this->defaultAction)) {
            $this->error('找不到 '.$actionName.' 方法', null, '', 9);
        }

        // 尝试 用model 获取
        $model = model($controllerName);
        $modelName = $controllerName;
        $controllerText = '[未命名]';

        if (!empty($model->tableName)) {
            $modelName = $model->tableName;
        }
        if (!empty($model->controllerText)) {
            $controllerText = $model->controllerText;
        }

        $adminContronller = new AdminController($modelName,$controllerText);

        return call_user_func(array($adminContronller,$actionName));
    }
}
